package com.data;

import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import android.util.Log;

import com.bean.LibraryBookBean;
import com.constant.Constant;
import com.net.ClientError;
import com.net.ClientException;
import com.net.RequestParameter;
/**
 * 
 * @author lenovo
 * 搜说图书馆图书数据接口
 * 
 * 使用说明：
 * 初始时传递参数为：<title> </title>
 * 加载下一页面时使用参数为：<title></title> <count></count> <page> </page>标签page数量一定要正确（可以不传，但不能为0）
 *  
 *  使用注意：
 *  first_request:表示第一次请求时的url连接
 *  reply_request:表示请求下一页面的url连接
 *  server_book:表示每一本书的url连接地址
 *  referer：表示当前连接请求的转发地址
 *  itemReferer:表示每一本书的请求转发连接地址
 *  mTotal:表示返回结果集总数
 *  mLibraryData:表示图书array列表
 * 
 *  bFirst：表示是否是第一次请求该连接，用于控制itemReferer参数
 *  
 *  该函数实现过程如下：
 *  首先判断是时加载第一页还是第二页获或者是第三页
 *  page = null || page == 1 表示当前请求的是第一个页面，此时加载默认连接地址FIRST_REQUEST和默认转发地址
 *  page = 2表示请求第二个页面，此时加载第二页的连接地址REPLY_REQUEST和转发地址（第一面请求地址）
 *  page >= 3表示加载后面请求地址，此时加载后面页面连接地址REPLY_REQUEST和转发地址（第二页面的请求地址）
 */
public final class SearchLibraryData extends BaseData {

	private final static String TAG = "Search_Library_data";
	/**
	 * 该请求传递的参数为strText=mysql
	 */
	private final static String FIRST_REQUEST = "http://202.115.151.118:8080/opac/openlink.php?strSearchType=title&match_flag=forward&historyCount=1&doctype=ALL&displaypg=20&showmode=list&sort=CATA_DATE&orderby=desc&location=ALL";
	/**
	 * 第二次请求传递的参数为strText=mysql; count = mTotal; page=3
	 */
	private final static String REPLY_REQUEST = "http://202.115.151.118:8080/opac/openlink.php?location=ALL&doctype=ALL&lang_code=ALL&match_flag=forward&displaypg=20&showmode=list&orderby=DESC&sort=CATA_DATE&onlylendable=no&with_ebook=";
	/**
	 * 每一个图书item时的连接地址首部
	 */
	private final static String SERVER_BOOK = "http://202.115.151.118:8080/OPAC/";
	
	/**
	 * 图书详细信息列表
	 */
	private ArrayList<LibraryBookBean> mLibraryData;
	/**
	 * 图书的总数
	 */
	private int mTotal;
	
	@Override
	public void startParse(final RequestParameter parameter) throws Exception {
		String url = null;
		// 判断请求的数据是第一页还是下一页面
		String action = parameter.getValue("page");
		
		if(action == null) {
			// 第一次请求
			url = FIRST_REQUEST + "&strText=" + URLEncoder.encode(parameter.getValue("title"), "utf-8");
			Log.i(TAG, "第一次搜索该关键字");
		}
		else {
			// 加载第二页数据，此时的转发参数为第一次请求的url连接
			url = REPLY_REQUEST + encodeParameters(parameter);
			Log.i(TAG, "请求第二页面");
		}

		// 获取网页源代码
		String stream = getConnection(url);
		if ( stream == null )
			return;
		
		readStream(stream);
		
	} // startPrase


	protected String getConnection(String urlS) throws Exception {
		
		URL url = new URL(urlS);
		HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		connection.setDoOutput(true);
		connection.setRequestMethod("GET");
		connection.setRequestProperty("accept", "text/html, application/xhtml+xml, */*");
		connection.setRequestProperty("Host", "202.115.151.118:8080");
		connection.setRequestProperty("Referer", "http://202.115.151.118:8080/OPAC/search.php");
		connection.setConnectTimeout(Constant.SET_CONNECTION_TIMEOUT);
		connection.setReadTimeout(Constant.SET_READ_TIMEOUT);
		
		connection.connect();
		
		if(connection.getResponseCode() != 200)	{
			Log.i(TAG, "获取图书信息网络连接失败，原因：" + connection.getResponseCode());
			throw new ClientException("网络请求失败", ClientError.ERROR_CONNECTION);
		}
		
		return getWebSource(connection.getInputStream(), "utf-8");
		//readStream(s_html.toString());
	}

	/**
	 * 解析返回数据的数据流
	 * 为抛出异常则表示数据解析成功，同时服务器没有返回该数据
	 */
	protected void readStream(String stream) throws Exception {
		Document document = Jsoup.parse(stream);
		
	
		Element content = document.getElementById("content");
		//System.out.println(content.html().toString());
		
		Element nodeCount = content.child(0).child(0);
		Element count = nodeCount.child(0).child(0);
		mTotal = Integer.parseInt(count.ownText().toString());
		System.out.println("total:" + mTotal);
		
		
		Elements bookList = content.getElementsByClass("book_list_info");
		if(bookList.size() == 0)
			return;
		mLibraryData = new ArrayList<LibraryBookBean>();
		for(int i = 0, len = bookList.size(); i < len; i++) {
			LibraryBookBean bean= analyzeBook(bookList.get(i));
			mLibraryData.add(bean);
		}
		
		//System.out.println(bookList.html().toString());
		
//		// 解析搜索结果中图书的数量，直接通过标签id查找
//		Element nodeCount = document.getElementById("titlenav");
//		if(nodeCount == null)
//			return;
//		
//		Elements strongs = nodeCount.select("strong");
//		Element strongElement = strongs.get(0);
//		
//		mTotal = Integer.parseInt(strongElement.ownText());
//		
//		Log.i(TAG, "返回图书数量：" + mTotal);
//		
//		Elements booksElements = document.getElementsByAttributeValue("id", "list_books");
//		
//		mLibraryData = new ArrayList<LibraryBookBean>();
//		
//		Log.i(TAG, "当前返回的图书数据：" + booksElements.size());
//		for(int i = 0, length = booksElements.size(); i < length; i++) {
//			Element div = booksElements.get(i);
//			
//			mLibraryData.add(analyzeBook(div));
//		}
//		
		Log.i(TAG, "数据解析成功");
		
	}	
	
	/**
	 * <li class="book_list_info"> 
	 * <h3>
	 * <span>中文图书</span>
	 * <a href="item.php?marc_no=0002820085">2.MySQL网络数据库技术精粹</a>
	 *  TP311.138MY/G135 </h3>
	 * 
	 * <p> 
	 * <span>馆藏复本：1 <br /> 可借复本：1</span>
	 *  高海茹主编 <br /> 机械工业出版社&nbsp;2002.1 <br /> 
	 * <img src="../tpl/images/star0.gif" title="总体评分及评价人数" />(0) <a href="item.php?marc_no=0002820085" class="tooltip" onmouseover="showDetail('0002820085')" onmouseout="hideDetail('0002820085')">馆藏
	 *  <s></s></a> 
	 *  </p> 
	 * </li>
	 */
	private LibraryBookBean analyzeBook(Element div) {
		
		LibraryBookBean bean = new LibraryBookBean();
		
		Element h3 = div.child(0);
		
		// 获取图书版本号
		Element span = h3.child(0);
		bean.version = span.ownText().toString();
		
		// 解析连接地址和标题
		span = h3.child(1);
		bean.url = SERVER_BOOK +span.attr("href");
		bean.title = span.ownText().toString();
		bean.location = h3.ownText().toString();
		
		
		Element p = div.child(1);
		String[] text = p.ownText().toString().split(" ");
		bean.author	=	text[0] + " " + text[1];
		span = p.child(0);
		text = span.ownText().toString().split(" ");
		bean.book_total	 = text[0];
		bean.book_avalible = text[1];
		
		return bean;
	}

	
	public ArrayList<LibraryBookBean> getLibrary() {
		return this.mLibraryData;
	}
	
	public int getTotal() {
		return this.mTotal;
	}
	
	public void printData() {
		System.out.println("总共" + mLibraryData.size() + "条数据");
		for(int i = 0; i < mLibraryData.size(); i++) {
			LibraryBookBean bean = mLibraryData.get(i);
			System.out.println("" + bean.title);
			System.out.println("" + bean.url);
			System.out.println("" + bean.author);
			System.out.println("" + bean.location);
			System.out.println("" + bean.version);
			//System.out.println(bean.publish);
			System.out.println("总量: " + bean.book_total);
			System.out.println("可借数量: " + bean.book_avalible);
			
		}
	}


}
